#ifndef clox_chunk_h
#define clox_chunk_h

#include "common.h"
#include "value.h"

// 一个字节的操作码，这个数字控制我们要处理的指令类型-加、减、查找变量等
typedef enum {
    // 产生特定常数的指令
    OP_CONSTANT,
    OP_NIL,
    OP_TRUE,
    OP_FALSE,
    // 21.2 表达式语句
    OP_POP,
    // 22.4.1 及时局部变量
    OP_GET_LOCAL,
    // 21.3 读取变量
    OP_GET_GLOBAL,
    OP_SET_LOCAL,
    // 21.4 复制
    OP_SET_GLOBAL,
    // 21.2 变量声明
    OP_DEFINE_GLOBAL,
    // 相等与比较运算符
    OP_EQUAL,
    OP_GREATER,
    OP_LESS,
    // 二元操作符，分别是加减乘除
    OP_ADD,
    OP_SUBTRACT,
    OP_MULTIPLY,
    OP_NOT, // 非 !
    OP_DIVIDE,
    //减法运算符
    OP_NEGATE,
    // 21.1 print 语句
    OP_PRINT,
    // 23.1 If语句
    OP_JUMP_IF_FALSE,
    OP_JUMP,
    // 23.3 While 语句
    OP_LOOP,
    // 24.5 函数调用
    OP_CALL,
    OP_RETURN,
} OpCode;

// 使用结构体保存数据
typedef struct {
    // 动态数组
    int count;
    int capacity;
    uint8_t* code;
    // 对应的代码行
    int* lines;
    // 常量
    ValueArray constants;
} Chunk;
// 初始化块，c中没有构造函数
void initChunk(Chunk* chunk);
// 释放内存
void freeChunk(Chunk* chunk);
// 将字节追加到块的末尾
void writeChunk(Chunk* chunk, uint8_t byte, int line);
// 想字节码块中添加一个新常量
int addConstant(Chunk* chunk, Value value);
#endif